﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Windows.Threading;
using System.Threading;

namespace ImaginationFactory
{
    class BatchProcessor
    {
        private ImageLibrary ImageLibrary;                          // 保存图像处理对象
        private List<Parameter> effectsList = new List<Parameter>();// 特效列表   
        private List<string> fileList = new List<string>();           // 待处理的图像的列表
        private List<string> filenameList = new List<string>();     // 当前目录下图片的文件名
        string[] pictureFile = { ".jpg", ".bmp", ".png", ".jpeg" }; // 图片文件扩展名
        Object thisLock = new Object();                             // 互斥对象
        int iterProcess = 0;                                        // 当前处理到的位置
        bool bEnd = false;
        String loadPath;                                            // 加载文件路径
        String savePath;                                            // 保存路径

        public BatchProcessor( ImageLibrary imagelibrary )
        {
            ImageLibrary = imagelibrary;
        }

        // 添加特效
        public void AddEffects( Parameter param )
        {
            effectsList.Add( param );
        }

        //
        // 一个线程
        //

        protected void ProcessAPicture()
        {
            string name;

            while ( true )
            {
                lock ( thisLock )
                {
                    // 从待处理列表中读取一张图片
                    if ( iterProcess < fileList.Count )
                    {
                        name = fileList[ iterProcess++ ];
                    }
                    else
                    {
                        if ( !bEnd )
                        {
                            bEnd = true;
                            MessageBox.Show( "批处理完成!" );
                        }
                        break;
                    }
                }

                // 创建图像处理
                ImaginationFactory.ImageLibrary imageLib = new ImaginationFactory.ImageLibrary();

                imageLib.LoadImageForThread( name );
                IntPtr hBitmap = imageLib.CurrentHBitmap;

                // 根据特效列表处理图像
                for ( int i = 0; i < effectsList.Count; i++ )
                {
                    Parameter param = new Parameter();
                    param = effectsList[ i ];

                    IntPtr oldBitmap = hBitmap;
                    hBitmap = ImaginationFactory.ImageLibrary.ImageEffects( hBitmap, ref param );
                    ImaginationFactory.ImageLibrary.DeleteObject( oldBitmap );
                }

                int start = imageLib.Filename.LastIndexOf( "\\" );
                String str = savePath + imageLib.Filename.Substring( start, imageLib.Filename.Length - start );
                ImaginationFactory.ImageLibrary.SavePicture( 
                    hBitmap,
                    str, 
                    PictureFileType.FileType_JPEG );
                ImaginationFactory.ImageLibrary.DeleteObject( hBitmap );
            }
        }

        public void LoadFiles( string path )
        {
            if ( path != null )
            {
                loadPath = path;
                // 添加已注册的图片文件名
                foreach ( string name in System.IO.Directory.GetFiles( path ) )
                {
                    string lowerName = name.ToLower();
                    foreach ( string type in pictureFile )
                    {
                        if ( lowerName.LastIndexOf( type ) == lowerName.Length - type.Length )
                        {
                            fileList.Add( name );
                            //MessageBox.Show( name );
                        }
                    }
                }
            }
        }

        public void SetSavePath( String path )
        {
            savePath = path;
        }


        //
        // 开始批处理
        //
        // 程序分配 nThread 个线程来处理图像。对于每个线程，它使用特效列表effectsList中的特效处理
        // 从待处理的文件列表fileList中读取出来的一张图片
        //
        public void StartProcess( int nThread = 1 )
        {
            iterProcess = 0;
            bEnd = false;
            for ( int i = 0; i < nThread; i++ )
            {
                Thread thread = new Thread( ProcessAPicture );
                thread.Start();
            }
        }

        // 获取当前ImageLibrary中打开的图像的同目录下的所有图片的名字
        public List<string> GetFiles()
        {
            try
            {
                // 清空文件名
                filenameList.Clear();

                // 取得打开文件的路径
                string path = ImageLibrary.Filename.Clone() as string;
                path = path.Substring( 0, path.LastIndexOf( '\\' ) + 1 );

                // 添加已注册的图片文件名
                foreach ( string name in System.IO.Directory.GetFiles( path ) )
                {
                    string lowerName = name.ToLower();
                    foreach ( string type in pictureFile )
                    {
                        if ( lowerName.LastIndexOf( type ) == lowerName.Length - type.Length )
                        {
                            filenameList.Add( name );
                            //MessageBox.Show( name );
                        }
                    }

                }

                return filenameList;
            }
            catch ( Exception er )
            {
                MessageBox.Show( er.ToString() );

                return null;
            }
        }
    }
}

